﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.IO;
namespace WSSGServer
{
    public class WSSG
    {
        private string  m_StarSystemName;        
        private bool m_IsWorck = false;
        private WSSGData m_Data;
        const string dir = "WSSGData";
        const string ssi = "StarSystemInfo.xml";
        public WSSGData WSSGDataStar
        {
            get { return m_Data; }
            set { m_Data = value; }
        }
        long last = 0;
       
        public string  StarSystemName
        {
            get { return m_StarSystemName; }
            set { m_StarSystemName = value; }
        }

        Thread m_WorckThread;
        public WSSG()
        {
            Console.WriteLine("Инициализация Сервера");
            Init();
            Console.WriteLine("Сервер готов к работе.");
            
        }
        ~WSSG()
        {
            m_Data.Save();
        }
        private void Init()
        {


           
            DirectoryInfo DI = new DirectoryInfo(dir);
            FileInfo FI = new FileInfo(dir+"/"+ssi);
            if (!DI.Exists || !FI.Exists)
            {
                Console.WriteLine("Отсутствует информационный файл системы: " + dir + "/" + ssi);
                Console.WriteLine("Создаем новую систему");
                createWSSGData();
            }
            else
            {
                Console.WriteLine("Загружаем сведения о системе из файла: " + dir + "/" + ssi);
                m_Data =   WSSGData.Load(dir, ssi);
              
            }
        }

        private void createWSSGData()
        {
            DirectoryInfo DI = new DirectoryInfo(dir);
            DI.Create();
            Console.WriteLine("Введите имя новой зведной системы:");
            string StarSystemName = Console.ReadLine();
            int sunCount = 1;
            int astCount = 10000;
            Console.WriteLine("Введите количество Солнц в системе (по умолчанию "+sunCount+"):");
            while(!int.TryParse(Console.ReadLine(),out sunCount))
            {
                Console.WriteLine("Введите количество Солнц в системе (по умолчанию "+sunCount+"):");
            }  
          Console.WriteLine("Введите количество Астероидов в системе (по умолчанию "+astCount+"):");
            while(!int.TryParse(Console.ReadLine(),out astCount))
            {
                Console.WriteLine("Введите количество Астероидов в системе (по умолчанию "+astCount+"):");
            }  
            m_Data = new WSSGData(dir, ssi,StarSystemName);
            Console.WriteLine("Создаем новую систему.");            
            m_Data.CreateNewSystem(sunCount, astCount);
            Console.WriteLine("Сохраняем сведения о системе в файл: " + dir + "/" + ssi);
            m_Data.Save();
        }
        public void Start()
        {
            Console.Title = "World Star System Geo Server";
            Console.WriteLine("Старт WSSG Сервера.");
            m_IsWorck = true;
            last = Environment.TickCount;
            m_WorckThread = new Thread(DoWorck);
            m_WorckThread.Start();
            run();
            Console.WriteLine("Сохраняем данные");
            m_Data.Save();
            Console.WriteLine("WSSG Сервер остановлен");
            Console.WriteLine("Press any key to exit");
            Console.ReadLine();
        }
        private void run()
        {
            while (m_IsWorck)
            {
               string input= Console.ReadLine();
               doInput(input);
            }
        }
        private void doInput(string argv)
         {
             if (argv.ToLower()=="stop")
             {
                 m_IsWorck = false;

                 m_Data.StarLive=TimeSpan.FromMilliseconds(m_Data.StarLive.Milliseconds+(Environment.TickCount-last));
                 last = Environment.TickCount;
             }
          }
        private void DoWorck()
        {
            while (m_IsWorck)
            {
                Thread.Sleep(0);
            }
        }
        
    }
}
